home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
076-100
/
disk_078
/
mandelvroom
/
disp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
18KB
|
787 lines
/**************************************************************************
*
* MandelVroom Display Setup/Cleanup
*
* Kevin L. Clague
*
* Copyright (C) 1987
*
**************************************************************************/
#include "mand.h"
extern struct Window *MandWind, *ContWind, *PalWind;
extern struct NewWindow NewMand, NewCont, NewPal;
extern struct Menu Menu;
extern struct Windows {
struct Windows *NextWindow;
struct Window *Window;
} *WindowList;
extern struct MenuItem ViewModeSubs[];
extern SHORT *ContourBase,Ceiling;
extern SHORT CountX, CountY;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct MathBase *MathBase;
struct Screen *screen = (struct Screen *) NULL;
struct RastPort *rp;
struct ViewPort *vp;
USHORT YScale, XScale;
USHORT *BabyBrotPointer = (USHORT *) NULL;
USHORT *BabyToPointer = (USHORT *) NULL;
USHORT *SleepyPointer = (USHORT *) NULL;
/* pointer types */
#define UNINITIALIZED 0
#define NORMPOINTER 1
#define TOPOINTER 2
#define SLEEPYPOINTER 3
UBYTE PointerType = UNINITIALIZED;
SHORT SavePalette[32];
SHORT Inited;
extern USHORT CmdMode;
struct NewScreen NewScreen = {
0,0, /* start position */
320, 200, 5, /* width, height, depth */
(UBYTE) 0, (UBYTE) 1, /* detail pen, block pen */
(USHORT) NULL, /* HIRES, INTERLACE, SPRITES, DUAL, HAM */
CUSTOMSCREEN, /* screen type */
(struct TextAttr *) NULL, /* font to use */
(UBYTE *) " MandelVroom v1.50 by Kevin L. Clague",
(struct Gadget *) NULL /* pointer to extra gadgets */
};
/***************************************************************************
*
* Open the Libraries and custom screen
*
**************************************************************************/
/*
* Open the libraries
*/
OpenLibs() {
IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0);
if (IntuitionBase == (struct IntuitionBase *) NULL) {
printf("Couldn't get Intuition\n");
return(100);
}
GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0);
if (GfxBase == (struct GfxBase *) NULL) {
printf("Couldn't get Graphics\n");
return(100);
}
MathBase = (struct MathBase *) OpenLibrary("mathffp.library",0);
if (MathBase == (struct MathBase *) NULL) {
printf("Couldn't get MathFFP\n");
return(100);
}
return(0);
} /* OpenLibs */
/*
* Close the libraries used
*/
CloseLibs() {
if (IntuitionBase != (struct IntuitionBase *) NULL) CloseLibrary(IntuitionBase);
if (GfxBase != (struct GfxBase *) NULL) CloseLibrary(GfxBase);
if (MathBase != (struct MathBase *) NULL) CloseLibrary(MathBase);
} /* CloseLibs */
/*
* Open the display
*/
OpenDisp()
{
SHORT i;
struct Window *OpenMyWind();
struct Screen *OpenScreen();
if (NewScreen.ViewModes & HIRES) {
NewScreen.Width = 640;
if ( NewScreen.Depth > 4 ) NewScreen.Depth = 4;
XScale = 1;
} else {
NewScreen.Width = 320;
XScale = 0;
}
if (NewScreen.ViewModes & INTERLACE) {
NewScreen.Height = 400;
YScale = 1;
} else {
NewScreen.Height = 200;
YScale = 0;
}
screen = OpenScreen( (struct NewScreen *) &NewScreen);
if (screen == (struct Screen *) NULL) {
AndDie("Can't open new screen!\n");
}
InitViewModesSubs();
InitDepthSubs();
InitGenSubs();
InitMaxISubs();
AllocateMice();
OpenMandWind();
if ( MandWind == (struct Window *) NULL ) {
AndDie("Can't open Picture window\n");
}
rp = MandWind->RPort;
vp = &screen->ViewPort;
if ( Inited )
LoadRGB4(vp, &SavePalette[0], 32);
Inited = 1;
return(0);
} /* opendisp */
/*
* Close the screen
*/
CloseDisp() {
LONG i;
ClosePalWind();
CloseContWind();
CloseMandWind();
if (Inited)
for (i = 0; i < 32; i++) SavePalette[i] = GetRGB4(vp->ColorMap, i);
if ( screen ) CloseScreen(screen);
FreeMice();
} /* CloseDisp */
AndDie( ErrMsg )
char *ErrMsg;
{
extern SHORT *CountBase;
printf("%s\n", ErrMsg);
CloseLibs();
CloseDisp();
if (CountBase)
FreeMem( CountBase, CountX * CountY * sizeof( USHORT ) );
printf("Something unrecoverable happened!!!\n");
exit(0);
}
/***************************************************************************
*
* Open and Close Window tools
*
**************************************************************************/
/*
* Open a window and put it in the window list
*/
struct Window *OpenMyWind(NewWind, Screen, Gadgets, Width, Height,
MaxWidth, MaxHeight)
struct NewWindow *NewWind;
struct Screen *Screen;
struct Gadget *Gadgets;
SHORT Width, Height, MaxWidth, MaxHeight;
{
struct Window *Window, *OpenWindow();
struct Windows *Windows;
NewWind->Screen = Screen;
NewWind->FirstGadget = Gadgets;
NewWind->Width = Width << XScale;
NewWind->Height = Height << YScale;
NewWind->MaxWidth = MaxWidth << XScale;
NewWind->MaxHeight = MaxHeight << YScale;
Window = OpenWindow( (struct NewWindow *) NewWind);
if (Window == (struct Window *) NULL) {
DispErrMsg("Can't open new window",0);
return( (struct Window *) NULL);
}
Windows = (struct Windows *) AllocMem(sizeof(struct Windows), MEMF_CLEAR);
if (Windows == (struct Windows *) NULL) {
DispErrMsg("Can't malloc Windows. Out of RAM!!",0);
return( (struct Window *) NULL);
}
Windows->Window = Window;
if (WindowList)
Windows->NextWindow = WindowList;
WindowList = Windows;
SetMenuStrip(Window, &Menu);
return(Window);
} /* OpenMyWind */
/*
* Remove the window from the window list,
* deallocate all the gadgets associated with this window
*/
CloseMyWind(Window,Gadgets)
struct Window *Window;
struct Gadget *Gadgets;
{
struct Windows *Windows = WindowList, *PrevWinds = WindowList;
if (Window) {
/* get rid of the menu */
ClearMenuStrip(Window);
/* get rid of the previous pointer */
ClearPointer(Window);
if (Window == Windows->Window) {
WindowList = WindowList->NextWindow;
FreeMem(Windows,sizeof(struct Windows));
} else {
while (Windows && Windows->Window != Window) {
PrevWinds = Windows;
Windows = Windows->NextWindow;
}
if (Windows) {
PrevWinds->NextWindow = Windows->NextWindow;
FreeMem(Windows,sizeof(struct Windows));
}
}
CloseWindow(Window);
if (Gadgets)
FreeGadgets(Gadgets);
}
} /* CloseMyWind */
/*************************************************************************
*
* Allocate and ititialize gadget tools
*
************************************************************************/
/*
* Make a generic boolean gadget
*/
struct Gadget *MakeBool(x,y,xd,yd,c,id)
SHORT x,y,xd,yd;
UBYTE c;
USHORT id;
{
struct Gadget *NewGadget;
struct Image *NewImage;
NewGadget = (struct Gadget *)
AllocMem( (LONG) sizeof(struct Gadget), (LONG) MEMF_CLEAR );
if (NewGadget == (struct Gadget *) NULL)
return((struct Gadget *) NULL);
NewImage = (struct Image *)
AllocMem( (LONG) sizeof(struct Image), (LONG) MEMF_CHIP | MEMF_CLEAR );
if (NewImage == (struct Image *) NULL) {
FreeMem( NewGadget, (LONG) sizeof(struct Gadget));
return((struct Gadget *) NULL);
}
NewGadget->LeftEdge = x << XScale;
NewGadget->TopEdge = y << YScale;
NewGadget->Width = xd << XScale;
NewGadget->Height = yd << YScale;
NewGadget->Flags = GADGHCOMP | GADGIMAGE;
NewGadget->Activation = GADGIMMEDIATE;
NewGadget->GadgetRender = (APTR) NewImage;
NewGadget->GadgetType = BOOLGADGET;
NewGadget->GadgetID = id;
NewImage->Width = xd << XScale;
NewImage->Height = yd << YScale;
NewImage->PlaneOnOff = c;
return(NewGadget);
} /* MakeBool */
/*
* Make a generic potentiometer gadget
*/
struct Gadget *MakePot(x, y, xd, yd, id, cnt)
SHORT x,y,xd,yd;
USHORT id;
USHORT cnt;
{
struct Gadget *NewGadget;
struct PropInfo *NewInfo;
struct Image *NewImage;
NewGadget = (struct Gadget *)
AllocMem( (LONG) sizeof(struct Gadget), MEMF_CLEAR );
if (NewGadget == (struct Gadget *) NULL)
return((struct Gadget *) NULL);
NewImage = (struct Image *)
AllocMem( (LONG) sizeof(struct Image), (LONG) MEMF_CHIP | MEMF_CLEAR );
if (NewImage == (struct Image *) NULL) {
FreeMem( NewGadget, (LONG) sizeof(struct Gadget));
return((struct Gadget *) NULL);
}
NewInfo = (struct PropInfo *)
AllocMem( (LONG) sizeof(struct PropInfo), MEMF_CLEAR );
if (NewInfo == (struct PropInfo *) NULL) {
FreeMem( NewGadget, (LONG) sizeof(struct Gadget));
FreeMem( NewImage, (LONG) sizeof(struct Image));
return((struct Gadget *) NULL);
}
NewGadget->LeftEdge = x << XScale;
NewGadget->TopEdge = y << YScale;
NewGadget->Width = xd << XScale;
NewGadget->Height = yd << YScale;
NewGadget->Flags = GADGHIMAGE | GADGIMAGE;
NewGadget->Activation = RELVERIFY;
NewGadget->GadgetType = PROPGADGET;
NewGadget->GadgetRender = (APTR) NewImage;
NewGadget->SelectRender = (APTR) NewImage;
NewGadget->SpecialInfo = (APTR) NewInfo;
NewGadget->GadgetID = id;
NewImage->PlaneOnOff = 1;
NewImage->Width = 4 << XScale;
NewImage->Height = 3 << YScale;
NewInfo->Flags = PROPBORDERLESS | FREEVERT;
return(NewGadget);
} /* MakePot */
/*
* Make an IntuiText structure
*/
struct IntuiText *MakeIntui(str, x, y, frontpen, backpen, drawmode )
UBYTE *str;
SHORT x, y;
UBYTE frontpen, backpen, drawmode;
{
struct IntuiText *NewIntui;
NewIntui = (struct IntuiText *)
AllocMem( (LONG) sizeof(struct IntuiText), (LONG) MEMF_CLEAR );
if (NewIntui == (struct IntuiText *) NULL)
return((struct IntuiText *) NULL);
NewIntui->FrontPen = frontpen;
NewIntui->BackPen = backpen;
NewIntui->DrawMode = drawmode;
NewIntui->LeftEdge = x << XScale;
NewIntui->TopEdge = y << YScale;
NewIntui->IText = str;
return(NewIntui);
} /* MakeIntui */
/*
* Free a string of gadgets
*/
FreeGadgets(FirstGadget)
struct Gadget *FirstGadget;
{
struct Gadget *NextGadget;
while (FirstGadget) {
if (FirstGadget->GadgetRender)
FreeMem(FirstGadget->GadgetRender, (LONG) sizeof(struct Image));
if (FirstGadget->SpecialInfo)
FreeMem(FirstGadget->SpecialInfo, (LONG) sizeof(struct PropInfo));
if (FirstGadget->GadgetText)
FreeMem(FirstGadget->GadgetText, (LONG) sizeof(struct IntuiText));
NextGadget = FirstGadget->NextGadget;
FreeMem(FirstGadget, (LONG) sizeof(struct Gadget));
FirstGadget = NextGadget;
}
} /* FreeGadgets */
/***************************************************************************
*
* This section handles the Mouse pointer for the custom screen
*
**************************************************************************/
/***************************************************************/
/* This is the image for baby Mandelbrot pointer */
/***************************************************************/
USHORT BabyBrotSprite[]= {
/*plane1 plane0 */
0x0000, 0x0000,
0x8000, 0x0000,
0x0000, 0x5000,
0x2000, 0x2202,
0x1600, 0x5f82,
0x0802, 0x1913,
0x1152, 0x11fe,
0x1008, 0x300a,
0x0404, 0x1c06,
0x0006, 0x1407,
0x0404, 0x0404,
0x000c, 0x042c,
0x0400, 0x0c1c,
0x0220, 0x0630,
0x01e0, 0x05f0,
0x0c80, 0x3f80,
0x0000, 0x0880,
0x0000, 0x0000,
};
/***************************************************************/
/* This is a baby brot pointer with 'TO' in it. */
/***************************************************************/
USHORT BabyToSprite[]= {
/*plane1 plane0 */
0x0000, 0x0000,
0x8000, 0x0000,
0x0100, 0x5100,
0x2000, 0x2202,
0x1600, 0x5f82,
0xfe7a, 0x0103,
0x93de, 0x0132,
0x108c, 0x200a,
0x5484, 0x4c02,
0x1086, 0x0403,
0x1484, 0x0400,
0x10cc, 0x0420,
0x3c78, 0x0404,
0x0220, 0x0630,
0x01e0, 0x05f0,
0x0c80, 0x3f80,
0x0000, 0x0880,
0x0000, 0x0000,
};
/***************************************************************/
/* This is a sleepy cloud pointer */
/***************************************************************/
USHORT SleepySprite[] = {
0x0000, 0x0000,
0x0fe0, 0x0000,
0x1830, 0x07c0,
0x7018, 0x0fe0,
0xc008, 0x3ff0,
0x9e0c, 0x7ff0,
0x8406, 0x7ff8,
0x8802, 0x7ffc,
0x1e03, 0xfffc,
0x80f1, 0x7ffe,
0x8021, 0x7ffe,
0x4040, 0x3fff,
0x80f1, 0x7ffe,
0xc001, 0x3ffe,
0x6003, 0x1ffc,
0x3006, 0x0ff8,
0x180c, 0x07f0,
0x0718, 0x00e0,
0x0070, 0x0f80,
0x1810, 0x07e0,
0x0820, 0x0740,
0x0ff0, 0x0000,
0x0020, 0x03c0,
0x0410, 0x03e0,
0x0310, 0x00e0,
0x00e0, 0x0000,
0x0000, 0x0000,
};
/* defines for the cute pointer sprite */
#define MYSPRITE_WIDTH 16
#define MYSPRITE_HEIGHT 16
#define SLEEPY_WIDTH 16
#define SLEEPY_HEIGHT 25
#define MYSPRITE_HOTX -1
#define MYSPRITE_HOTY 0
#define BABYSIZE ( (MYSPRITE_HEIGHT + 2) * 8)
#define TOSIZE ( (MYSPRITE_HEIGHT + 2) * 8)
#define SLEEPYSIZE ( (SLEEPY_HEIGHT + 2) * 8)
/*
* Copy an Image into a chip ram image
*/
USHORT *MakeChipSprite( FastRamSprite, Size )
USHORT *FastRamSprite;
int Size;
{
USHORT *ChipSprite, *SaveSprite, *AllocaMem();
int i;
ChipSprite = AllocMem( (LONG) (Size * sizeof(SHORT)), MEMF_CHIP );
if ( ChipSprite == (struct USHORT * ) NULL )
return ( ChipSprite );
SaveSprite = ChipSprite;
for ( i = 0; i < Size; i++)
*(ChipSprite++) = *(FastRamSprite++);
return( SaveSprite );
}
/*
* Allocate all the mouse pointer sprites used by this program
*/
AllocateMice()
{
BabyBrotPointer = MakeChipSprite( BabyBrotSprite, BABYSIZE );
BabyToPointer = MakeChipSprite( BabyToSprite, TOSIZE );
SleepyPointer = MakeChipSprite( SleepySprite, SLEEPYSIZE );
}
/*
* Free all the mouse pointer sprites used by this program
*/
FreeMice()
{
if ( BabyBrotPointer )
FreeMem( BabyBrotPointer, BABYSIZE * sizeof(SHORT) );
BabyBrotPointer = NULL;
if ( BabyToPointer )
FreeMem( BabyToPointer, TOSIZE * sizeof(SHORT) );
BabyToPointer = NULL;
if ( SleepyPointer )
FreeMem( SleepyPointer, SLEEPYSIZE * sizeof(SHORT) );
SleepyPointer = NULL;
}
/*
* Set all window pointers NewPointer
*/
SetPointers( NewPointer, Height, Width)
USHORT *NewPointer;
int Height, Width;
{
if (NewPointer == (struct USHORT *) NULL )
return();
if ( ContWind )
SetPointer( ContWind, NewPointer, Height, Width,
MYSPRITE_HOTX, MYSPRITE_HOTY);
if ( MandWind )
SetPointer( MandWind, NewPointer, Height, Width,
MYSPRITE_HOTX, MYSPRITE_HOTY);
if ( PalWind )
SetPointer( PalWind, NewPointer, Height, Width,
MYSPRITE_HOTX, MYSPRITE_HOTY);
}
/*
* Clear the window pointers
*/
ClearPointers()
{
if ( MandWind ) ClearPointer( MandWind );
if ( ContWind ) ClearPointer( ContWind );
if ( PalWind ) ClearPointer( PalWind );
}
/*
* Force normal pointers
*/
ForceNormPointer()
{
PointerType = UNINITIALIZED;
SetNormPointer();
}
/*
* Set Normal Mouse Pointer
*/
SetNormPointer()
{
if (PointerType != NORMPOINTER ) {
ClearPointers();
SetPointers( BabyBrotPointer, MYSPRITE_HEIGHT, MYSPRITE_WIDTH );
PointerType = NORMPOINTER;
}
CmdMode = NULL;
}
/*
* Set 'To' Mouse Pointer
*/
SetToPointer()
{
if (PointerType != TOPOINTER ) {
ClearPointers();
SetPointers( BabyToPointer, MYSPRITE_HEIGHT, MYSPRITE_WIDTH );
PointerType = TOPOINTER;
}
}
/*
* Set Sleepy Mouse Pointer
*/
SetSleepyPointer()
{
if (PointerType != SLEEPYPOINTER ) {
ClearPointers();
SetPointers( SleepyPointer, SLEEPY_HEIGHT, SLEEPY_WIDTH );
PointerType = SLEEPYPOINTER;
}
}
SetSystemColors(flag)
int flag;
{
UWORD red, green, blue;
static SHORT MenuColors[4] = { 0x0000, 0x0fff, 0x000a, 0x0b44 };
static SHORT PointerColors[4] = { 0x0000, 0x00c0, 0x0dd0, 0x0f00 };
static SHORT ColorSave[32];
static SHORT SaveFull = 0;
int i;
if (flag) {
if (SaveFull == 0) {
for (i = 0; i < 32; i++) {
ColorSave[i] = GetRGB4(vp->ColorMap, i);
}
/* Set the colors for the Menu */
for (i = 0; i < 4; i++) {
red = (MenuColors[i] & 0xf00) >> 8;
green = (MenuColors[i] & 0x0f0) >> 4;
blue = (MenuColors[i] & 0x00f) ;
SetRGB4(vp, i , red , green, blue);
}
/* Set the colors for the Mouse pointer */
for (i = 0; i < 4; i++) {
red = (PointerColors[i] & 0xf00) >> 8;
green = (PointerColors[i] & 0x0f0) >> 4;
blue = (PointerColors[i] & 0x00f) ;
SetRGB4(vp, i + 16, red , green, blue);
}
}
SaveFull++;
} else {
if (SaveFull == 1)
LoadRGB4(vp, &ColorSave[0], 32);
if (--SaveFull < 0) SaveFull = 0;
}
}
/**************************************************************************
*
* This code is used to display error messages on the cusom screen
*
**************************************************************************/
struct IntuiText msg_txt =
{
0,
1,
JAM2,
5,
20,
NULL,
NULL,
NULL
};
struct IntuiText OK_txt =
{
0,
1,
JAM2,
5,
3,
NULL,
(UBYTE *) "OK",
NULL
};
struct IntuiText NO_txt =
{
0,
1,
JAM2,
5,
3,
NULL,
(UBYTE *) "NO",
NULL
};
DispErrMsg(ErrMsg, Flag)
UBYTE *ErrMsg;
SHORT Flag;
{
msg_txt.IText = ErrMsg;
SetNormPointer();
if (MandWind) {
SetSystemColors(1);
if (Flag) {
AutoRequest(MandWind, &msg_txt, &OK_txt, &NO_txt, 0L, 0L,
(long) (IntuiTextLength(&msg_txt) + 50L), 70L);
} else {
AutoRequest(MandWind, &msg_txt, 0L, &OK_txt, 0L, 0L,
(long) (IntuiTextLength(&msg_txt) + 50L), 70L);
}
SetSystemColors(0);
} else {
printf("%s\n", ErrMsg);
}
}